<?php
namespace UserProposal;

use Pinenut\Form;
use Pinenut\Config;
use Users\Helper\SmartRedirect;

/**
 * Форма принятия решения по предложению пользователя
 *
 * @author kosh
 *        
 */
abstract class SurveyAction extends \Action {
	protected static $isPublic = true;
	
	protected static $layout = "";

	/**
	 *
	 * @var string
	 */
	protected $type;

	/**
	 *
	 * @var Config
	 */
	protected static $_formConfigClass;

	static function pullParams( ) {
		return [
			'identity',
			'isPost',
		];
	}

	protected function run( ) {
		if (!$this->request->id) {
			throw new \Exception('Wrond id', 500);
		}
		
		// получаем состояние текущего или получаем новый, в общем что-нить да получаем
		$proposal = Proposal::find($this->request->id);
		
		// делаем форму по конфе
		
		$formConfigClass = static::$_formConfigClass;
		$formConfig = $formConfigClass::get();
		$formConfig['htmlOptions']['action'] = $this->url(
			$this->request->action, [
				'id' => $this->request->id
			]);
		$form = new Form($this->request->_identity, 
			'UserProposal-Survey-' . $this->type . $this->request->id, 
			$formConfig);
		
		if ($this->request->_isPost && $this->request->isPartial) {
			// обработчик валидации и черновика
			$form->process($this->request->params(), true);
			$this->response->content = $form->render();
			$this->response->noRender(true);
			return;
		} elseif ($this->request->_isPost) {
			// проверяем полне данные
			if (! $form->process($this->request->params())) {
				$this->response->form = $form;
				return;
			}
			// уже проверили что всё ок
			$data = $form->getValues();
			
			// делаем что-то полезное
			
			// добавляем пользователя в список проголосовавших
			if (! in_array($this->request->_identity, $proposal->surveysUserIds)) {
				$proposal->surveysUserIds[] = $this->request->_identity;
				$proposal->surveysCount ++;
			}
											
			// в данных в сабмите должно быть значение резолюции
			if ($data['confirm']) {
				$proposal->confirmedUserIds[] = $this->request->_identity;
				$proposal->confirmedCount ++;
			} else {
				$proposal->rejectedUserIds[] = $this->request->_identity;
				$proposal->rejectedCount ++;
			}
			
			// например модифицируем заявку
			$proposal = $this->doSurvey($proposal, $data);
			
			$proposal->save();	

			$form->flush();
			$this->response->noRender(true);
			$this->redirect(SmartRedirect::getRedirectPoint('to-user-proposal-stack'));
			
			
		} else {
			// $form->setValues();
		}
		
		$this->response->form = $form;
		$this->response->proposal = $proposal;
	}

	/**
	 * Еще как-то модифицируем предложение в соответствии с нашей логикой для этого типа предложения
	 * 
	 * @param Proposal $proposal        	
	 * @param array $data        	
	 * @return unknown
	 */
	function doSurvey($proposal, $data) {
		return $proposal;
	}
}